#include "writertomodel.h"
#include <QFile>
#include <QXmlStreamWriter>
#include <QAbstractItemModel>
#include <QDebug>

WriterFromModel::WriterFromModel(QAbstractItemModel *M, QXmlStreamWriter *W, QObject *parent):
		QObject(parent), space(trUtf8("Љ")), w(W), m(M){
	w->setAutoFormatting(true);
}

WriterFromModel::~WriterFromModel(){
	if(w!=NULL)
		delete w;
}


/** Записать атрибуты вопроса.*/
inline void WriterFromModel::writeQAtr(int i){
	for(int j = 0, l = m->columnCount(); j < l; ++j)
		w->writeAttribute(m->headerData(j, Qt::Horizontal).toString().replace(" ", space),
													 m->index(i, j).data().toString());
}

/** Записать атрибуты ответа.*/
inline void WriterFromModel::writeAAtr(int j, const QModelIndex & p){
//	for(int k = 0, s = m->columnCount(p); k < s; ++k)
//		w->writeAttribute(m->index(0, k, p).data().toString().replace(" ", space),
//													 m->index(j, k, p).data().toString());
	w->writeAttribute(trUtf8("Текст"), m->index(j, 0, p).data().toString());
	w->writeAttribute(trUtf8("Ответ"), m->index(j, 1, p).data().toString());
}

/** Записать вариант ответа.*/
inline void WriterFromModel::writeV(const QModelIndex & p){
	qDebug()<<m->rowCount(p);
	for(int j = 0, l = m->rowCount(p); j < l; ++j){
		w->writeStartElement(trUtf8("Ответ"));

		// Запишу атрибуты.
		writeAAtr(j, p);

		w->writeEndElement(); // Ответ
	}

}

/** Записать данные в xml.*/
void WriterFromModel::write(){
//---Если пишем в файл, то открываю его.-----------------------------------------------
	QFile *f = 0;
	if(f = qobject_cast<QFile *>(w->device()))
		f->open(QIODevice::WriteOnly);

//--Работаю только, если есть модель.--------------------------------------------------
	if (m == NULL){ // Если указатель не указывает на модель
		qDebug()<<trUtf8("Указатель не указывает на модель.");
		return;
	}

//--Запишу данные.---------------------------------------------------------------------
	w->writeStartDocument();
	// На верхнем уровне xml один элемент.
	w->writeStartElement(trUtf8("Анкета"));

	// Запишу все строки верхнего уровня модели, как элементы 2-го уровня xml.
	for(int i = 0, n = m->rowCount(); i < n; ++i){
		w->writeStartElement(trUtf8("Вопрос"));

		// Запишу атрибуты.
		writeQAtr(i);

		// Запишу варианты ответов на i-ый вопрос как элементы 3-го уровня xml.
		writeV(m->index(i,0));

		w->writeEndElement(); // Вопрос
	}
	w->writeEndElement(); // Анкета
	w->writeEndDocument();

//--Если пишем в файл, то закрываю его.------------------------------------------------
	if(f) f->close();
}

QXmlStreamWriter * WriterFromModel::streamWriter(){
	return w;
}

void WriterFromModel::setStreamWriter(QXmlStreamWriter * streamWriter){
	if(w!=NULL)
		delete w;
	w = streamWriter;
}
